﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using ModeloDesenvolvimento;
using Sys.Project.Funcoes;
using Sys.Project.Formularios;

namespace Poligas_ERP.Forms
{
    public partial class FrmVendas : Form
    {
        SqlConnection cnx = new SqlConnection();
        SqlCommand cmd = new SqlCommand();
        SqlDataReader dr;
        DataTable dt = new DataTable();
        Db db = new Db();


        int vend_Id = 0;


        public FrmVendas()
        {
            InitializeComponent();
        }

        private void FrmVendas_Load(object sender, EventArgs e)
        {
            HabilitarControlesIniciais(true);
            PopularCombos();
        }
        private void FrmVendas_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Return)
            {
                SendKeys.Send("{TAB}");
            }
        }
        private void FrmVendas_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8) && e.KeyChar != Convert.ToChar(44))
                e.Handled = true;
        }

        void HabilitarControlesIniciais(bool status)
        {
            gbxDadosManutencao.Enabled = !status;
            btnSalvar.Enabled = !status;
            btnCancelar.Enabled = !status;
            btnNovo.Enabled = status;
        }
        void LimparCampos()
        {
            txtNumVenda.Clear();
            cmbFuncionario.SelectedIndex = 0;
            txtClienteId.Clear();
            txtClienteCpfCnpj.Clear();
            txtClienteNome.Clear();
            txtProdutoId.Clear();
            txtProdutoDescricao.Clear();
            txtProdutoUnit.Clear();
            txtProdutoQtde.Clear();
            dgvItensVenda.Rows.Clear();
            txtProdutoTotal.Clear();
            //cmbTipoVenda.SelectedIndex = -1;
            //txtNumParcelas.Clear();
            //ckbEntrada.Checked = false;
            txtDesconto.Clear();
            txtTotalVenda.Clear();
        }
        void PopularCombos()
        {
            cnx = db.AbreConexao("strConexao");
            cmd = db.getCommand(cnx);

            cmd.CommandText = "spVendedorSelectPesquisar";
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@Nome", string.Empty);

            DataTable dtFuncionario = new DataTable();
            dtFuncionario.Clear();
            dtFuncionario.Load(cmd.ExecuteReader());

            cmbFuncionario.DataSource = dtFuncionario;
            cmbFuncionario.DisplayMember = "Nome";
            cmbFuncionario.ValueMember = "CodVendedor";

            cmd.CommandText = "spTipovendaSelectPesquisa";
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@Descricao", string.Empty);

            DataTable dtTipoVenda = new DataTable();
            dtTipoVenda.Clear();
            dtTipoVenda.Load(cmd.ExecuteReader());

            //cmbTipoVenda.DataSource = dtTipoVenda;
            //cmbTipoVenda.DisplayMember = "Descricao";
            //cmbTipoVenda.ValueMember = "CodTipoVenda";

            db.FechaConexao(cnx);
        }
        void AtualizaValores()
        {
            decimal totalProdutos = 0M;
            foreach(DataGridViewRow r in dgvItensVenda.Rows)
            {
                totalProdutos += Convert.ToDecimal(r.Cells["VlTotal"].Value);//ver sobre colocar esta coluna no banco de dados
            }
            txtProdutoTotal.Text = string.Format("{0:N2}", totalProdutos);

            int desconto = 0;
            int.TryParse(txtDesconto.Text, out desconto);

            txtTotalVenda.Text = string.Format("{0:N2}", totalProdutos - desconto);
            txtProdutoId.Focus();
        }
        //void CalculaParcelas()
        //{
        //    int nrParcela = 0;
        //    int.TryParse(txtNumParcelas.Text, out nrParcela);

        //    decimal total = 0;
        //    decimal.TryParse(txtTotalVenda.Text, out total);

        //    if(nrParcela > 0 && total > 0M)
        //    {
        //        decimal parc = total / nrParcela;

        //        dgvParcelas.Rows.Clear();
        //        DateTime dtVenc = DateTime.Now;
        //        if(!ckbEntrada.Checked)
        //            dtVenc = dtVenc.AddMonths(1);

        //        string descricao = string.Empty;
        //        for(int i = 1; i <= nrParcela; i++)
        //        {
        //            descricao = "Parcela " + string.Format("{0:00000}", i) + "/" + string.Format("{0:00000}", nrParcela);
        //            dgvParcelas.Rows.Add(dtVenc, parc, descricao, 0);
        //            dtVenc = dtVenc.AddMonths(1);
        //        }
        //    }
        //    else
        //        dgvParcelas.Rows.Clear();
        //}

        void GravarDados(int op)
        {
            string msg = string.Empty;
            cnx = db.AbreConexao("strConexao");
            cmd = db.getCommand(cnx);

            if(op == 1)
            {
                
                msg = "Venda realizada com sucesso";

                cmd.Parameters.AddWithValue("@CodVendedor", Convert.ToInt32(cmbFuncionario.SelectedValue));
                cmd.Parameters.AddWithValue("@CodCliente", Convert.ToInt32(txtClienteId.Text));
                cmd.Parameters.AddWithValue("@CodTipoVenda", DBNull.Value);
                cmd.Parameters.AddWithValue("@CodSituacao", DBNull.Value);
                cmd.Parameters.AddWithValue("@Data", dtpDataVenda.Value);
                //cmd.Parameters.AddWithValue("@vend_VlTotal", Convert.ToDecimal(txtProdutoTotal.Text));
                decimal desconto = 0M;
                decimal.TryParse(txtDesconto.Text, out desconto);
                cmd.Parameters.AddWithValue("@Desconto", desconto);
                // cmd.Parameters.AddWithValue("@vend_VlTotalFinal", Convert.ToDecimal(txtTotalVenda.Text));

                
                try
                {
                    int i = 0;
                    if(op == 1)
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandText = "spVendasInsert";
                        cmd.ExecuteNonQuery();

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = "Select * from Vendas where CodVenda=ident_current('Vendas')";

                        //dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        dr = cmd.ExecuteReader();
                        if(dr.Read())
                        {
                            vend_Id = Convert.ToInt32(dr["CodVenda"]);
                            i = 1;
                            dr.Close();
                        }
                    }
                    else
                        i = cmd.ExecuteNonQuery();

                    if(i > 0)
                    {
                        if(GravarDadosItens(vend_Id) > 0)
                        {
                            //LancarCaixa(vend_Id);
                            //GravarParcelas(vend_Id);
                            HabilitarControlesIniciais(true);
                            MessageBox.Show(msg, "Venda", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            LimparCampos();
                        }
                        else
                            MessageBox.Show("Erro ao Gravar o Registro.", "Venda", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                        MessageBox.Show("Erro ao Gravar o Registro.", "Venda", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch(SqlException sqlErrr)
                {
                    RetornaErroSqlServer retErro = new RetornaErroSqlServer();
                    string msgErro = retErro.RetornaErro(sqlErrr.Number);
                    if(string.IsNullOrEmpty(msgErro))
                        msgErro = sqlErrr.Message;
                    MessageBox.Show(msgErro, "Venda", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch(Exception err)
                {
                    MessageBox.Show(err.Message, "Venda", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    db.FechaConexao(cnx);
                }
            }
        }

        int GravarDadosItens(int idVenda)
        {
            string msg = string.Empty;

            cnx = db.AbreConexao("srtConexao");
            cmd = db.getCommand(cnx);
            
            cmd.CommandText = "spItensvendaDelete";

            cmd.Parameters.AddWithValue("@CodItens", idVenda);

            cmd.ExecuteNonQuery();

            int i = 0;
            try
            {
                foreach(DataGridViewRow r in dgvItensVenda.Rows)
                {
                    cmd.CommandText = "spItensvendaInsert";
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@CodVenda", idVenda);
                    cmd.Parameters.AddWithValue("@CodProduto", Convert.ToInt32(r.Cells["CodProduto"].Value));
                    cmd.Parameters.AddWithValue("@Qtd", Convert.ToDecimal(r.Cells["Qtd"].Value));
                    cmd.Parameters.AddWithValue("@VlUnitario", Convert.ToDecimal(r.Cells["VlUnitario"].Value));
                    // cmd.Parameters.AddWithValue("@itensvd_VlTotal", Convert.ToDecimal(r.Cells["itensvd_VlTotal"].Value));

                    cmd.ExecuteNonQuery();
                    db.FechaConexao(cnx);

                    i++;

                    AtualizaEstoque(Convert.ToInt32(r.Cells["CodProduto"].Value), Convert.ToDecimal(r.Cells["Qtd"].Value));
                }
                return i;
            }
            catch(SqlException sqlErrr)
            {
                i = 0;
                throw;
            }
            catch(Exception err)
            {
                i = 0;
                throw;
            }
        }
        //int LancarCaixa(int idVenda)
        //{
        //    string historicoVenda = string.Empty;
        //    if(Convert.ToInt32(cmbTipoVenda.SelectedValue) == 2)
        //    {
        //        historicoVenda = "VENDA A VISTA - " + "NR. VENDA: " + string.Format("{0:00000}", idVenda) + " - CLIENTE: " + txtClienteId.Text.PadLeft(5, '0') + "-" + txtClienteNome.Text;
        //        return InserirNoCaixa(historicoVenda, idVenda, Convert.ToDecimal(txtTotalVenda.Text));
        //    }
        //    return 0;
        //}
        int InserirNoCaixa(string historico, int idVenda, decimal valor)
        {
            cnx = db.AbreConexao("strConexao");
            cmd = db.getCommand(cnx);

            cmd.CommandText = "spCaixaInsert";

            cmd.Parameters.AddWithValue("@DataCaixa", dtpDataVenda.Value);
            cmd.Parameters.AddWithValue("@Historico", historico + " - " + string.Format("{0:00000}", idVenda));
            cmd.Parameters.AddWithValue("@Tipo", "E");
            cmd.Parameters.AddWithValue("@Valor", valor);

            if(cnx.State != ConnectionState.Open)
                cnx.Open();

            int i = 0;
            try
            {
                i = cmd.ExecuteNonQuery();
            }
            catch(SqlException sqlErrr)
            {
                i = 0;
                throw;
            }
            catch(Exception err)
            {
                i = 0;
                throw;
            }
            finally
            {
                cnx.Close();
            }
            return i;
        }
        //int GravarParcelas(int idVenda)
        //{
        //    int i = 0;
        //    if(Convert.ToInt32(cmbTipoVenda.SelectedValue) == 3)
        //    {
        //        cmd.Connection = cnx;
        //        cmd.CommandType = CommandType.StoredProcedure;
        //        foreach(DataGridViewRow r in dgvParcelas.Rows)
        //        {
        //            if(Convert.ToDateTime(r.Cells["parc_DtVenc"].Value).Date > dtpDataVenda.Value.Date)
        //            {
        //                cmd.CommandText = "spParcelasInsert";
        //                cmd.Parameters.Clear();
        //                cmd.Parameters.AddWithValue("@parc_vend_ID", idVenda);
        //                cmd.Parameters.AddWithValue("@parc_cli_ID", Convert.ToInt32(txtClienteId.Text));
        //                cmd.Parameters.AddWithValue("@parc_Descri", r.Cells["parc_Descri"].Value.ToString());
        //                cmd.Parameters.AddWithValue("@parc_Valor", Convert.ToDecimal(r.Cells["parc_Valor"].Value));
        //                cmd.Parameters.AddWithValue("@parc_DtVenc", Convert.ToDateTime(r.Cells["parc_DtVenc"].Value));

        //                if(cnx.State != ConnectionState.Open)
        //                    cnx.Open();
        //                cmd.ExecuteNonQuery();
        //                cnx.Close();
        //                i++;
        //            }
        //            else
        //            {
        //                string historicoVenda = "ENTRADA DA VENDA: " + string.Format("{0:00000}", idVenda) + " - CLIENTE: " + txtClienteId.Text.PadLeft(5, '0') + "-" + txtClienteNome.Text;
        //                InserirNoCaixa(historicoVenda, idVenda, Convert.ToDecimal(r.Cells["parc_Valor"].Value));
        //                i++;
        //            }
        //        }
        //    }
        //    return i;
        //}
        void AtualizaEstoque(int idProduto, decimal qtde)
        {
            cnx = db.AbreConexao("strConexao");
            cmd = db.getCommand(cnx);

            cmd.CommandText = "spProdutosAtualizaEstoque";

            cmd.Parameters.AddWithValue("@CodProduto", idProduto);
            cmd.Parameters.AddWithValue("@QtdEstoque", qtde * -1M);



            int i = 0;
            try
            {
                i = cmd.ExecuteNonQuery();
            }
            catch(SqlException sqlErrr)
            {
                RetornaErroSqlServer retErro = new RetornaErroSqlServer();
                string msgErro = retErro.RetornaErro(sqlErrr.Number);
                if(string.IsNullOrEmpty(msgErro))
                    msgErro = sqlErrr.Message;
                MessageBox.Show(msgErro);
            }
            catch(Exception err)
            {
                MessageBox.Show(err.Message);
            }
            finally
            {
                db.FechaConexao(cnx);
            }
        }


        private void btnCliente_Click(object sender, EventArgs e)
        {
            cmdConsultaCliente();
        }

        private void cmdConsultaCliente()
        {
            var frm = new FrmClienteConsulta();
            frm.ShowDialog();
            txtClienteId.Text = frm.IdCliente;
            txtClienteCpfCnpj.Text = frm.CpfCnpjCliente;
            txtClienteNome.Text = frm.NomeCliente;
            frm.Dispose();

            if(string.IsNullOrEmpty(txtClienteId.Text))
                txtClienteId.Focus();
            else
                txtProdutoId.Focus();
        }
        private void btnProduto_Click(object sender, EventArgs e)
        {
            cmdConsultaProduto();
        }

        private void cmdConsultaProduto()
        {
            var frm = new FrmProdutoConsulta();
            frm.ShowDialog();
            txtProdutoId.Text = frm.IdProduto;
            txtProdutoDescricao.Text = frm.DescricaoProduto;
            txtProdutoUnit.Text = frm.ValorUnit;
            txtUnidade.Text = frm.IdUnidade;

            frm.Dispose();

            if(string.IsNullOrEmpty(txtClienteId.Text))
                txtProdutoId.Focus();
            else
                txtProdutoQtde.Focus();
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            HabilitarControlesIniciais(false);
            dgvItensVenda.Rows.Clear();
            txtProdutoQtde.Text = "1";
            txtClienteId.Text = "1";
            txtClienteNome.Text = "A CONSUMIDOR";
            cmbFuncionario.Focus();
        }
        private void btnEditar_Click(object sender, EventArgs e)
        {

        }
        private void btnExcluir_Click(object sender, EventArgs e)
        {

        }
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if(string.IsNullOrEmpty(txtClienteId.Text.Trim()))
            {
                MessageBox.Show("Selecione um Cliente", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtClienteId.Focus();
                return;
            }

            if(dgvItensVenda.Rows.Count <= 0)
            {
                MessageBox.Show("Não existe itens para realizar a venda", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtProdutoId.Focus();
                return;
            }

            /* if(txtClienteId.Text.Equals("1") && Convert.ToInt32(cmbTipoVenda.SelectedValue) != 2)
             {
                 MessageBox.Show("Selecione um Cliente para realizar este Tipo de Venda.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 txtClienteId.Focus();
                 return;
             }

             if(Convert.ToInt32(cmbTipoVenda.SelectedValue) == 3 && dgvParcelas.Rows.Count <= 0)
             {
                 MessageBox.Show("Digite o número de parcelas para esta Tipo de Venda.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 txtNumParcelas.Focus();
                 return;
             }

             if(Convert.ToInt32(cmbTipoVenda.SelectedValue) == 3 && Convert.ToInt32(txtNumParcelas.Text) == 1 && ckbEntrada.Checked)
             {
                 MessageBox.Show("Selecione o Tipo de Venda A VISTA para este tipo de configuração.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 txtNumParcelas.Focus();
                 return;
             }*/

            GravarDados(1);
        }
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            HabilitarControlesIniciais(true);
            LimparCampos();
        }

        private void btnAddItem_Click(object sender, EventArgs e)
        {
            cmdInserirItem();
        }

        private void cmdInserirItem()
        {
            if(string.IsNullOrEmpty(txtProdutoId.Text.Trim()))
            {
                MessageBox.Show("Selecione o Produto.", "Venda", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtProdutoId.Focus();
                return;
            }

            decimal qtde = 0;
            decimal.TryParse(txtProdutoQtde.Text, out qtde);
            if(qtde == 0M)
            {
                MessageBox.Show("Digite a quantidade.", "Venda", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtProdutoQtde.Focus();
                return;
            }

            decimal unit = 0;
            decimal.TryParse(txtProdutoUnit.Text, out unit);

            decimal valorTotalProduto = qtde * unit;

            dgvItensVenda.Rows.Add(txtProdutoId.Text, txtProdutoDescricao.Text, txtUnidade.Text, string.Format("{0:N2}", qtde), string.Format("{0:N2}", unit), string.Format("{0:N2}", valorTotalProduto));
            AtualizaValores();
            txtProdutoId.Clear();
            txtProdutoDescricao.Clear();
            txtProdutoUnit.Clear();
            txtUnidade.Clear();
            txtProdutoQtde.Clear();
            txtProdutoId.Focus();
        }
        private void btnDelItem_Click(object sender, EventArgs e)
        {
            if(dgvItensVenda.Rows.Count <= 0)
            {
                MessageBox.Show("Não existem itens para remover", "Venda", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtProdutoId.Focus();
                return;
            }

            dgvItensVenda.Rows.Remove(dgvItensVenda.SelectedRows[0]);
            AtualizaValores();
        }

        /*private void cmbTipoVenda_SelectedValueChanged(object sender, EventArgs e)
        {
            if(cmbTipoVenda.Items.Count > 0)
            {
                try
                {
                    ckbEntrada.Enabled = (bool)(Convert.ToInt32(cmbTipoVenda.SelectedValue) == 3);
                    txtNumParcelas.Enabled = ckbEntrada.Enabled;
                    gbxParcelas.Enabled = ckbEntrada.Enabled;
                }
                catch { }

                try
                {
                    if(Convert.ToInt32(cmbTipoVenda.SelectedValue) != 3)
                    {
                        dgvParcelas.Rows.Clear();
                        txtNumParcelas.Clear();
                        ckbEntrada.Checked = false;
                    }
                }
                catch { }
            }


        }*/

        /*private void txtNumParcelas_Leave(object sender, EventArgs e)
        {
            CalculaParcelas();
        }
        private void ckbEntrada_CheckedChanged(object sender, EventArgs e)
        {
            int nrParcela = 0;
            int.TryParse(txtNumParcelas.Text, out nrParcela);
            if(nrParcela > 0)
                CalculaParcelas();
        }*/

        private void txtDesconto_Leave(object sender, EventArgs e)
        {
            AtualizaValores();
            // CalculaParcelas();

            decimal desconto = 0;
            decimal.TryParse(txtDesconto.Text, out desconto);

            txtDesconto.Text = string.Format("{0:N2}", desconto);
        }
        private void txtDesconto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8) && e.KeyChar != Convert.ToChar(44))
                e.Handled = true;
        }
        private void txtClienteId_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(!Char.IsNumber(e.KeyChar) && e.KeyChar != Convert.ToChar(8))
                e.Handled = true;
        }
        private void txtProdutoId_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(!Char.IsNumber(e.KeyChar) && e.KeyChar != Convert.ToChar(8))
                e.Handled = true;
        }
        private void txtProdutoQtde_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(!Char.IsNumber(e.KeyChar) && e.KeyChar != Convert.ToChar(8))
                e.Handled = true;
        }
        private void txtNumParcelas_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(!Char.IsNumber(e.KeyChar) && e.KeyChar != Convert.ToChar(8))
                e.Handled = true;
        }

        private void txtProdutoId_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
            {
                cmdConsultaProduto();
            }
        }

        private void txtClienteId_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Enter)
            {
                cmdConsultaCliente();
            }
        }

        private void txtProdutoQtde_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
            {
                cmdInserirItem();
            }
            txtProdutoId.Focus();
        }

       


    }
}
